﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using kk.components.contracts;
using kk.messages.contracts.DataModel;
using kk.messages.contracts.ViewModel;

namespace kk.belegungsplanfactory
{
    public class BelegungsplanFactory : IBelegungsplanFactory
    {
        public void ProcessBelegungsplanZuVorstellung(Request<Vorstellung, Belegungsplan> request)
        {
            var saalplan = this.OnBestuhlungZuSaalplan.Request<string, Saalplan>(request.RequestData.Saal).Return();
            var preiskategorien = this.OnPreiskategorien.Request<IEnumerable<Preiskategorie>>().Return();
            var belegungen = this.OnBelegungenZuVorstellung.Request<Vorstellung, IEnumerable<Platzposition>>(request.RequestData).Return();

            var belegtePlätze = from platz in saalplan.Plätze
                                select new Platzbelegung(
                                                platz.Platzposition, 
                                                preiskategorien.First(pk => pk.KategorieSchlüssel == platz.PreiskategorieSchlüssel), 
                                                belegungen.Any(p => p.Reihe==platz.Platzposition.Reihe && p.Platznummer==platz.Platzposition.Platznummer));
                                
            request.ResponsePin(new Belegungsplan(belegtePlätze.ToArray()));
        }

        public event Action<Request<string, Saalplan>> OnBestuhlungZuSaalplan;
        public event Action<Request<IEnumerable<Preiskategorie>>> OnPreiskategorien;
        public event Action<Request<Vorstellung, IEnumerable<Platzposition>>> OnBelegungenZuVorstellung;
    }
}
